/* Algoritmo 2 */

alg2:-
	listaSitiInteresse(Lrest),
	assert(api([])),
	once(selezionaAree(Lrest)).

/* Funzione ricorsiva che seleziona le aree (caso base) */

selezionaAree(Lrest):-
	Lrest=[X|[]],
	X=_-S,
	sito2area(S,AC),
	retractall(tx(AC,_)),
	assert(tx(AC,0)),
	ampliaArea(AC,NA1),
	aggiustaArea(NA1,NA),
	sitiInteresseIn(NA,Siti),
	assert(sitiSelezionati(Siti)),
	assert(api([NA])).

/* Funzione ricorsiva che seleziona le aree */
selezionaAree(Lrest):-
	Lrest=[X|Lrest1],
	selezionaAree(Lrest1),
	api(API1),
	sitiSelezionati(SitiAggiunti),
	X=_-S,
	(not(member(S,SitiAggiunti)) 
		-> sito2area(S,AC),
		   retractall(tx(AC,_)),	
		   assert(tx(AC,0)),
		   ampliaArea(AC,NA1),
		   aggiustaArea(NA1,NA),
		   sitiInteresseIn(NA,SitiAggiunti2),
		   setof(Z,(member(Z,SitiAggiunti2);member(Z,SitiAggiunti)),Siti),
		   append(API1,[NA],API)
		;  API=API1,
		   Siti=SitiAggiunti),
	retract(api(API1)),
	assert(api(API)),
	retract(sitiSelezionati(SitiAggiunti)),
	assert(sitiSelezionati(Siti)).

